package controller

import (
	"dsc-server/domain/dto"
	"dsc-server/domain/resp"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

// BaseController 基础控制器
type BaseController struct{}

// ParseTime 将字符串解析为时间
func (b *BaseController) ParseTime(timeStr string) (time.Time, error) {
	// 尝试多种格式解析时间
	layouts := []string{
		"2006-01-02 15:04:05",
		"2006-01-02",
		"2006/01/02 15:04:05",
		"2006/01/02",
	}

	var t time.Time
	var err error
	for _, layout := range layouts {
		t, err = time.Parse(layout, timeStr)
		if err == nil {
			return t, nil
		}
	}

	return time.Time{}, err
}

// StartPage 设置分页参数
func (b *BaseController) StartPage(c *gin.Context) (int, int, string) {
	// 获取分页参数
	pageNumStr := c.DefaultQuery("pageNum", "1")
	pageSizeStr := c.DefaultQuery("pageSize", "10")
	orderBy := c.DefaultQuery("orderBy", "")

	// 转换为整数
	pageNum, err := strconv.Atoi(pageNumStr)
	if err != nil || pageNum < 1 {
		pageNum = 1
	}

	pageSize, err := strconv.Atoi(pageSizeStr)
	if err != nil || pageSize < 1 {
		pageSize = 10
	}

	// 防止SQL注入
	if orderBy != "" {
		// 简单的SQL注入防护，实际应用中需要更复杂的处理
		orderBy = EscapeOrderBySql(orderBy)
	}

	return pageNum, pageSize, orderBy
}

// GetDataTable 响应分页数据
func (b *BaseController) GetDataTable(c *gin.Context, list interface{}, total int64, hasNextPage bool) {
	// 构建分页响应
	tableData := resp.TableDataInfo{
		List:        list,
		Total:       total,
		HasNextPage: hasNextPage,
	}

	c.JSON(200, tableData)
}

// ToAjax 响应操作结果
func (b *BaseController) ToAjax(c *gin.Context, rows int64) {
	if rows > 0 {
		c.JSON(200, dto.Success("操作成功"))
	} else {
		c.JSON(200, dto.Failure("操作失败"))
	}
}

// EscapeOrderBySql 转义排序SQL，防止SQL注入
func EscapeOrderBySql(orderBy string) string {
	// 简单的SQL注入防护，实际应用中需要更复杂的处理
	// 这里只是一个示例，实际应用中应该使用更安全的方法
	return orderBy
}
